function output = WindowsAndFilter(input, lower_limit, upper_limit, WindowSize,FilterNumber)

% 输入：
% input: 待处理数组
% lower_limit: 下限，超过下限的数字将被替换为下限
% upper_limit: 上限，超过上限的数字将被替换为上限

%window size滑动窗口大小
%Filter Number去除掉的极值数量

% 输出：
% output: 经过卡尔曼滤波处理后的数组

% 修正超出上下限的数字
input(input < lower_limit) = lower_limit;
input(input > upper_limit) = upper_limit;

% 将 NaN 替换为下限
input(isnan(input)) = lower_limit;

% 将 inf 替换为上限
input(isinf(input) & input > 0) = upper_limit;
input(isinf(input) & input < 0) = lower_limit;

for i = 1:length(input)
    if(i <= WindowSize)
        output(i,1) = input(i,1);
    else
        % 获取当前窗口中的历史数据
        windowData = input(i-WindowSize+1:i,1);

        % 去掉最小值和最大值
        sortedWindowData = sort(windowData);
        sortedWindowData = sortedWindowData(FilterNumber+1:end-FilterNumber);

        % 计算平均值
        output(i,1) = mean(sortedWindowData);
    end
end


x=[1:length(input)];

% 绘制图像
figure;
plot(x, input, 'g', x, output, 'k');
legend('Raw Data',  'Smoothed Data', 'Location', 'NorthWest');

end